use crate::boot::db;
use crate::boot::err::MyError;
use crate::lib::{util_string};
use crate::model::SysOrgan;
use crate::api::*;
use crate::model::SysRole;

use actix_session::Session; 
use actix_web::{web, HttpResponse, Result}; 
use rbs::Value as rbv;
use serde_json::{Value}; 
use std::collections::HashSet;  

// 用户登录
pub async fn login(session: Session, data: web::Json<Value>) -> Result<HttpResponse, MyError> {
    let phone = data["phone"].as_str().unwrap_or("");  // 获取参数，转换失败则赋予 ""
    let password = data["password"].as_str().unwrap_or(""); 
    let pas_md5 = util_string::app_md5(password);  // MD5加密

    log::debug!("手机号：{} 密码：{} 加密后密码：{}", phone, password, pas_md5);  
    
    // 执行 sql 语句，并把结果存入 Vec 中，如读取失败则返回错误 MyError::Db 
    let sql = "select * from sys_organ where status > 0 and org_type = 3 and phone = ? and password = ? ";
    let list = db::RB.fetch_decode::<Vec<SysOrgan>>(sql, 
      vec![rbv::String(phone.into()), rbv::String(pas_md5.into())]).await.map_err(|e| MyError::Db(e))?;
     
    // 读取第一条数据，如果不存在则表示数据是空的
    // 这里需要使用 into_iter() 而不是使用 iter() ，
    // into_iter() 会转移所有权,如在不需要转移所有权的情况下使用 iter()
    if let Some(record) = list.into_iter().next(){  
        let data = record;   
        
        let id = data.id.unwrap_or(0);
        let name = data.name.unwrap_or("".into()); 

        if id > 0 {
            // 读取用户权限列表
            let role_sql = format!("select * from sys_role where status > 0 and id in ({}) ;", data.roles.unwrap_or("None".into()));
            let role_list = db::RB.fetch_decode::<Vec<SysRole>>(&role_sql, vec![]).await.map_err(|e|MyError::Db(e))?;
            let mut hash_set = HashSet::<i32>::new();
            for role in role_list {
                let power_list = role.power_list.unwrap_or("".into()); 

                let v = power_list.split(',').map(|v| v.parse::<i32>().unwrap_or(0));

                v.for_each(|power|{
                    _ = &hash_set.insert(power);
                }); 
            }  

            let member_bean = MemberBean{
                id : id,
                pid : data.pid.unwrap_or(0),
                tid : data.tid.unwrap_or(0),
                name : name.to_string(),
                powers : hash_set.into_iter().collect::<Vec<i32>>(),
            }; 

            log::info!("member_bean : {:?}", &member_bean);

            if let Ok(_) = session.insert(const_val::SESSION_MEMBER_BEAN, &member_bean) {
                resp_ok(1, "登录成功",  &member_bean)
            } else {
                resp_err(-1, "保存登录信息失败！") 
            }
        } else {
            resp_err(-1, "账号或密码错误！ " )
        } 
    } else {
        resp_err(-1, "账号或密码错误！ ")
    }  
}

// 用户登录
pub async fn logout(session: Session) -> Result<HttpResponse, MyError> { 
    if let Some(s) = session.remove(const_val::SESSION_MEMBER_BEAN) {
        resp_ok(1, "注销成功",  s)
    } else {
        resp_err(-1, "注销失败")
    } 
}

 